﻿#include <iostream>
#include <string>

using namespace std;

// 关键字表置初始值
string keyword[30] = { "#", "begin", "if", "then", "while", "do", "end", "", "", "",
                      "letter(letter|digit)*", "digitdigit*", "", "+", "-", "*", "/",
                      ":", ":=", "", "<", "<>", "<=", ">", ">=", "=", ";", "(", ")" };

class word {
public:
    int syn{};
    string token;
};

// 处理单词的函数
word letterAnalysis(const string& subCode) {
    word item;
    if (subCode.substr(0, 5) == "begin") {
        item.syn = 1;
    }
    else if (subCode.substr(0, 2) == "if") {
        item.syn = 2;
    }
    else if (subCode.substr(0, 4) == "then") {
        item.syn = 3;
    }
    else if (subCode.substr(0, 5) == "while") {
        item.syn = 4;
    }
    else if (subCode.substr(0, 2) == "do") {
        item.syn = 5;
    }
    else if (subCode.substr(0, 3) == "end") {
        item.syn = 6;
    }
    else {
        // 如果是其它单词，截取到第一个非字符
        for (int i = 0; i < subCode.length(); ++i) {
            if (!(subCode[i] > 'a' && subCode[i] < 'z')) {
                item.syn = 10;
                keyword[item.syn] = subCode.substr(0, i);
                break;
            }
        }
    }
    item.token = keyword[item.syn];
    return item;
}

// 处理数字的函数
word numberAnalysis(string subCode) {
    word item;
    item.syn = 11;
    for (int i = 0; i < subCode.length(); ++i) {
        // 截取到第一个非数字字符
        if (!(subCode[i] >= '0' && subCode[i] <= '9')) {
            keyword[item.syn] = subCode.substr(0, i);
            break;
        }
    }
    item.token = keyword[item.syn];
    return item;
}

// 处理字符的函数
word charAnalysis(string subCode) {
    word item;
    switch (subCode[0]) {
    case '#':
        item.syn = 0;
        break;
    case '+':
        item.syn = 13;
        break;
    case '-':
        item.syn = 14;
        break;
    case '*':
        item.syn = 15;
        break;
    case '/':
        item.syn = 16;
        break;
    case ':':
        if (subCode[1] == '=') {
            item.syn = 18;
        }
        else {
            item.syn = 17;
        }
        break;
    case '<':
        if (subCode[1] == '>') {
            item.syn = 21;
        }
        else if (subCode[1] == '=') {
            item.syn = 22;
        }
        else {
            item.syn = 20;
        }
        break;
    case '>':
        if (subCode[1] == '=') {
            item.syn = 24;
        }
        else {
            item.syn = 23;
        }
        break;
    case '=':
        item.syn = 25;
        break;
    case ';':
        item.syn = 26;
        break;
    case '(':
        item.syn = 27;
        break;
    case ')':
        item.syn = 28;
        break;
    }
    item.token = keyword[item.syn];
    return item;
}

// 词法分析
void scanner(const string& code) {
    for (int i = 0; i < code.length(); ++i) {
        word item;
        if (code[i] > 'a' && code[i] < 'z') {
            // 处理单词
            item = letterAnalysis(code.substr(i, code.length() - i + 1));
        }
        else if (code[i] >= '0' and code[i] <= '9') {
            // 处理数字
            item = numberAnalysis(code.substr(i, code.length() - i + 1));
        }
        else if (code[i] == ' ') {
            // 如果是空格，直接跳过
            continue;
        }
        else {
            // 处理特殊符号
            item = charAnalysis(code.substr(i, code.length() - i + 1));
        }
        i += int(item.token.length()) - 1;
        cout << "(" << item.syn << "," << item.token << ")" << endl;
    }
}

int main() {
    string code;
    cout << "Please input string:";
    // 读入一行代码，因为代码中有空格，所以要用 getline
    getline(cin, code);
    scanner(code);
    return 0;
}